append([], X, X).
append( [H | T], Y, [H | Z]) :- append(T, Y, Z).

% interseccion(+L1, +L2, -L3)
interseccion([], _, []).
interseccion([X|XS], L2, L3) :- member(X, L2), interseccion(XS, L2, W), append([X], W, L3).
interseccion([X|XS], L2, L3) :- not(member(X, L2)), interseccion(XS, L2, L3).

% intercalar(?L1, ?L2, ?L3)
intercalar([], L2, L2).
intercalar(L1, [], L1).
intercalar([X|XS], [Y|YS], [X|[Y|ZS]]) :- intercalar(XS, YS, ZS).

% split(N, L, L1, L2)
split(0, L, [], L).
split(N, [X|XS], [X|L1], L2) :- split(W, XS, L1, L2), N is W + 1, N > 0.

% borrar(+ListaOriginal, +X, -ListaSinXs)
borrar([], _, []).
borrar([X|XS], X, YS) :- borrar(XS, X, YS).
borrar([X|XS], Y, YS) :- X \= Y, borrar(XS, Y, W), append([X], W, YS).

listasIguales([], []).
listasIguales([X|XS], [X|YS]) :- listasIguales(XS, YS).

%sacarDuplicados(+L1, -L2)
sacarDuplicados([], []).
sacarDuplicados([X|XS], YS) :- sacarDuplicados(XS, W), member(X, W), listasIguales(W, YS).
sacarDuplicados([X|XS], YS) :- sacarDuplicados(XS, W), not(member(X, W)), append([X], W, YS).

masParejoQueOtroCorte(L, Corte1, Corte2, 0, [], L)

% corteMasParejo(+L,-L1,-L2)
corteMasParejo(L, Corte1, Corte2) :- append(Corte1, Corte2, L), masParejoQueOtroCorte(Corte1, Corte2, L).
